home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 2
/
AACD 2.iso
/
AACD
/
Magazine
/
GraphicsCards
/
StormMesa
/
src
/
MGL
/
halftone.h
< prev
next >
Wrap
C/C++ Source or Header
|
1999-02-04
|
7KB
|
187 lines
/****************************************************************************
*
* Mesa bindings for SciTech MGL
*
* Copyright (C) 1996-1998 SciTech Software, Inc.
* All rights reserved.
*
* Language: ANSI C
* Environment: IBM PC (MS DOS)
*
* Description: Header file for the windows compatible HalfToning tables
* for creating a HalfTone palette and for performing the
* HalfTone dithering algorithm in 8/15/16 bpp modes.
*
* The halftone palette is set up to use entries from 20 to
* 226 in the physical palette, leaving the top 20 and bottom
* 20 for operating system specific use.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
****************************************************************************/
#ifndef __HALFTONE_H
#define __HALFTONE_H
/*---------------------- Macro and type definitions -----------------------*/
/* Macros to halfTone dither an 8bpp RGB pixel */
#define PACK_COLOR_DITHER8(p,x,y,R,G,B) \
{ \
uchar dither = _MGL_dither8x8[(((y) & 7) << 3) + ((x) & 7)];\
(p) = 20 + \
_MGL_div51[R] + (_MGL_mod51[R] > dither) + \
_MGL_mul6[_MGL_div51[G] + (_MGL_mod51[G] > dither)] + \
_MGL_mul36[_MGL_div51[B] + (_MGL_mod51[B] > dither)]; \
}
#define HALFTONE_VARS_8 \
int __Rdiv51,__Rmod51; \
int __Gdiv51,__Gmod51; \
int __Bdiv51,__Bmod51; \
uchar *__dp
#define SETUP_DITHER8(y,R,G,B) \
{ \
__dp = &_MGL_dither8x8[((y) & 7) << 3]; \
__Rdiv51 = _MGL_div51[R]; \
__Rmod51 = _MGL_mod51[R]; \
__Gdiv51 = _MGL_div51[G]; \
__Gmod51 = _MGL_mod51[G]; \
__Bdiv51 = _MGL_div51[B]; \
__Bmod51 = _MGL_mod51[B]; \
}
#define PACK_COLOR2_DITHER8(p,x) \
{ \
uchar __dither = __dp[(x) & 7]; \
(p) = 20 + \
__Rdiv51 + (__Rmod51 > __dither) + \
_MGL_mul6[__Gdiv51 + (__Gmod51 > __dither)] + \
_MGL_mul36[__Bdiv51 + (__Bmod51 > __dither)]; \
}
/* Macros to halfTone dither a 16bit 5/5/5 RGB pixel */
#define PACK_COLOR_DITHER555(p,x,y,R,G,B) \
{ \
uchar _dither = _MGL_dither4x4[(((y) & 3) << 2) + ((x) & 3)]; \
(p) = (ushort) \
((((ulong)_MGL_div8[R] + (_MGL_mod8[R] > _dither)) << 10) + \
(((ulong)_MGL_div8[G] + (_MGL_mod8[G] > _dither)) << 5) + \
(((ulong)_MGL_div8[B] + (_MGL_mod8[B] > _dither)) << 0)); \
}
#define HALFTONE_VARS_16 \
int __Rdiv8,__Rmod8; \
int __Gdiv8,__Gmod8; \
int __Bdiv8,__Bmod8; \
uchar *__dp
#define SETUP_DITHER555(y,R,G,B) \
{ \
__dp = &_MGL_dither4x4[((y) & 3) << 2]; \
__Rdiv8 = _MGL_div8[R]; \
__Rmod8 = _MGL_mod8[R]; \
__Gdiv8 = _MGL_div8[G]; \
__Gmod8 = _MGL_mod8[G]; \
__Bdiv8 = _MGL_div8[B]; \
__Bmod8 = _MGL_mod8[B]; \
}
#define PACK_COLOR2_DITHER555(p,x) \
{ \
uchar _dither = __dp[(x) & 3]; \
(p) = (ushort) \
(((__Rdiv8 + (__Rmod8 > _dither)) << 10) + \
((__Gdiv8 + (__Gmod8 > _dither)) << 5) + \
((__Bdiv8 + (__Bmod8 > _dither)) << 0)); \
}
/* Macros to halfTone dither a 16bit 5/6/5 RGB pixel */
#define PACK_COLOR_DITHER565(p,x,y,R,G,B) \
{ \
uchar _dither = _MGL_dither4x4[(((y) & 3) << 2) + ((x) & 3)]; \
(p) = (ushort) \
((((ulong)_MGL_div8[R] + (_MGL_mod8[R] > _dither)) << 11) + \
(((ulong)_MGL_div4[G] + (_MGL_mod4[G] > (_dither>>1))) << 5) + \
(((ulong)_MGL_div8[B] + (_MGL_mod8[B] > _dither)) << 0)); \
}
#define SETUP_DITHER565(y,R,G,B) \
{ \
__dp = &_MGL_dither4x4[((y) & 3) << 2]; \
__Rdiv8 = _MGL_div8[R]; \
__Rmod8 = _MGL_mod8[R]; \
__Gdiv8 = _MGL_div4[G]; \
__Gmod8 = _MGL_mod4[G]; \
__Bdiv8 = _MGL_div8[B]; \
__Bmod8 = _MGL_mod8[B]; \
}
#define PACK_COLOR2_DITHER565(p,x) \
{ \
uchar __dither = __dp[(x) & 3]; \
(p) = (ushort) \
(((__Rdiv8 + (__Rmod8 > __dither)) << 11) + \
((__Gdiv8 + (__Gmod8 > (__dither>>1))) << 5) + \
((__Bdiv8 + (__Bmod8 > __dither)) << 0)); \
}
/*--------------------------- Global Variables ----------------------------*/
extern palette_t _VARAPI _MGL_halftonePal[];
/* Division lookup tables. These tables compute 0-255 divided by 51 and
* modulo 51. These tables could approximate gamma correction.
*/
extern unsigned char _VARAPI _MGL_div51[256];
extern unsigned char _VARAPI _MGL_mod51[256];
extern unsigned char _VARAPI _MGL_div8[256];
extern unsigned char _VARAPI _MGL_mod8[256];
extern unsigned char _VARAPI _MGL_div4[256];
extern unsigned char _VARAPI _MGL_mod4[256];
/* Multiplication lookup tables. These compute 0-5 times 6 and 36. */
extern unsigned char _VARAPI _MGL_mul6[6];
extern unsigned char _VARAPI _MGL_mul36[6];
/* Dither matrices */
extern unsigned char _VARAPI _MGL_dither8x8[64];
extern unsigned char _VARAPI _MGL_dither4x4[16];
/*------------------------- Function Prototypes ---------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
void MGLAPI MGL_getHalfTonePalette(palette_t *pal);
uchar MGLAPI MGL_halfTonePixel(int x,int y,uchar R,uchar G,uchar B);
ushort MGLAPI MGL_halfTonePixel555(int x,int y,uchar R,uchar G,uchar B);
ushort MGLAPI MGL_halfTonePixel565(int x,int y,uchar R,uchar G,uchar B);
#ifdef __cplusplus
}
#endif
#endif /* __HALFTONE_H */